package dao

import (
	"context"

	"catering_sys_api/cmd/api/model"
	"catering_sys_api/core/db"

	"gorm.io/gorm"
)

type StoreDao struct {
	ctx context.Context
}

func NewStoreDao(ctx context.Context) *StoreDao {
	return &StoreDao{ctx: ctx}
}

func (p *StoreDao) GetStoreHasOneStoreUserListByBusinessId(businessId, page, pageSize int) (storeUserHasOneStoreList []model.StoreHasOneStoreUser, pagination *model.Pagination, err error) {
	var count int64
	err = db.DB.Model(&model.Store{}).Where("business_id = ? ", businessId).Count(&count).Error
	if err != nil {
		return
	}
	pagination = model.NewPagination(page, pageSize, count)
	err = db.DB.Model(&model.Store{}).Where("business_id = ? ", businessId).Preload("StoreUser", func(db *gorm.DB) *gorm.DB {
		return db.Model(model.StoreUser{}).Select("id,user_name,phone,store_id")
	}).Offset(pagination.GetOffset()).Limit(pagination.GetLimit()).Find(&storeUserHasOneStoreList).Error
	return
}

func (p *StoreDao) GetStoreListByBusinessId(businessId int) (storeList []model.Store, err error) {
	err = db.DB.Model(model.Store{}).Where("business_id = ?", businessId).Find(&storeList).Error
	return
}

func (p *StoreDao) GetStoreByStoreIdAndBusinessId(storedId int, businessId int) (store model.Store, err error) {
	err = db.DB.Model(model.Store{}).Where("id = ? and business_id = ?", storedId, businessId).First(&store).Error
	return
}

func (p *StoreDao) GetStoreByBusinessIdAndStoreName(businessId int, storeName string) (store model.Store, err error) {
	err = db.DB.Model(model.Store{}).Where("business_id = ? and store_name = ?", businessId, storeName).First(&store).Error
	if gorm.ErrRecordNotFound == err {
		err = nil
	}
	return
}

func (p *StoreDao) UpdateStoreByStoreIdAndBusinessId(store model.Store, db *gorm.DB) (err error) {
	err = db.Model(model.Store{}).Where("id = ? and business_id = ?", store.ID, store.BusinessID).Updates(map[string]interface{}{
		"store_name":     store.StoreName,
		"store_status":   store.StoreStatus,
		"store_location": store.StoreLocation,
		"store_desc":     store.StoreDesc,
	}).Error
	return
}

// add
func (p *StoreDao) AddStore(store *model.Store, db *gorm.DB) (err error) {
	err = db.Create(store).Error
	return
}
